


#ifndef PERSON_H
#define PERSON_H



#include "subject.h"



class PersonType
{
public:
    enum eType
    {
        HUMAN = 0,
        WIZARD = 1,
        VAMPIRE = 2
    };
    PersonType( eType type );
    PersonType( const PersonType &type );
    const char * const getText() const;
    operator eType() const { return m_nType; }
    
private:
    eType m_nType;
};



class Person : public Subject
{
public:    
    Person( const char* name, PersonType::eType type, bool anonym, bool fat, bool truth, Color::eColor col );
    
    PersonType getType() const { return m_PendingType; }
    const char * const getName() const { return m_pPendingName; }
    bool isIncognito() const { return m_bIncognito; }
    bool isFat() const { return m_bFat; }
    void mutateName( const char * name ) { m_pPendingName = name; }
    virtual bool isLikeInitial() const;
    virtual bool mutate();
    virtual void restore();
    
    virtual void putText( std::ostream &S ) const;
    
    static const char *getRandomName();
    
private:
    PersonType m_Type;
    PersonType m_PendingType;
    bool m_bIncognito;
    bool m_bFat;
    const char * m_pName;
    const char * m_pPendingName;
};



std::ostream & operator << ( std::ostream &S, const Person &person );
    

    
#endif
